home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / p4 / p4-1_2a.lha / p4-1.2a / monitors / addtwo.ask.c next >
C/C++ Source or Header  |  1992-10-19  |  2KB  |  98 lines

  1. #include "p4.h"
  2.  
  3. #define MAXLEN 500
  4. #define MAXPROCS 256
  5.  
  6. struct globmem {
  7.     int length;
  8.     int a[MAXLEN], b[MAXLEN], c[MAXLEN];
  9.     int num_added[MAXPROCS];
  10.     int sub;
  11.     int slave_id;
  12.     p4_lock_t go_lock;
  13.     p4_askfor_monitor_t askfor;
  14. } *glob;
  15.  
  16.  
  17. int getprob(v)            /* return next available subscript */
  18. P4VOID *v;
  19. {
  20. int rc = 1;   /* any non-zero means NO problem found */
  21. int *p;
  22.  
  23.     p = (int *) v;
  24.     if (glob->sub < glob->length)
  25.     {
  26.     *p = glob->sub++;
  27.     rc = 0;    /* FOUND a problem */
  28.     }
  29.     return(rc);
  30. }
  31.  
  32. P4VOID reset()
  33. {
  34. }
  35.  
  36. slave()
  37. {
  38.     work();
  39. }
  40.  
  41. main(argc,argv)
  42. int argc;
  43. char **argv;
  44. {
  45. int i, j, n, start, end;
  46.  
  47.     p4_initenv(&argc,argv);   /* args not used but passed for compat */
  48.  
  49.     glob = (struct globmem *) p4_shmalloc(sizeof(struct globmem));
  50.  
  51.     glob->sub = 0;
  52.     glob->slave_id = 0;
  53.     p4_lock_init(&(glob->go_lock));
  54.     p4_askfor_init(&(glob->askfor));
  55.  
  56.     /* read in the length and the two vectors */
  57.     scanf("%d",&glob->length);
  58.     for (i = 0; i < glob->length; i++)
  59.     scanf("%d",&glob->a[i]);
  60.     for (i = 0; i < glob->length; i++)
  61.     scanf("%d",&glob->b[i]);
  62.     
  63.     p4_create_procgroup();
  64.  
  65.     start = p4_clock();
  66.     work();
  67.     end   = p4_clock();
  68.  
  69.     for (i = 0; i < glob->length;) 
  70.     {
  71.     for (j = 0; (j < 9) && (i < glob->length); j++)
  72.         printf("%d\t", glob->c[i++]);
  73.     printf("\n");
  74.     }
  75.     for (i = 0, n = p4_num_total_ids(); i < n; i++)
  76.     printf("num by %d = %d \n",i,glob->num_added[i]);
  77.  
  78.     p4_wait_for_end();
  79. }
  80.  
  81. work()
  82. {
  83. int i, j, myid, nprocs, rc;
  84.  
  85.     /* lock/unlock acts like a barrier */
  86.     p4_lock(&(glob->go_lock));
  87.     p4_unlock(&(glob->go_lock));
  88.  
  89.     myid = p4_get_my_id();
  90.     glob->num_added[myid] = 0;
  91.     nprocs = p4_num_total_ids();
  92.     while (p4_askfor(&(glob->askfor),nprocs,getprob,(P4VOID *)&i,reset) == 0)
  93.     {
  94.     glob->c[i] = glob->a[i] + glob->b[i];
  95.     glob->num_added[myid]++;
  96.     }
  97. }
  98.